/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

/*
 	存入set的元素必须是唯一的，因为set不保存重复元素，加入set的元素必须定义equals方法以确保对象唯一性
 	set和collextion具有一样的接口
 	hashset没有任何功能，但是速度最快也应该是默认选择，存入hashset的元素必须定义hashcode,当然object中有hashcode
 	treeset 保持次序的set，底层为树结构，它可以从set中有序的提取元素，元素必须实现 Comparable接口
 	LinkedHashSet 具有hashset的查询速度，且内部使用链表维护元素顺序（插入的顺序），于是在使用迭代器便利set时候，结果会按照插入顺序显示
 	元素也必须定义hashcode
 	
 	
 	HashSet的性能基本上总是比TreeSet好，特别是在添加和查询元素时，而这两个操作也是最重要的操作。
 	TreeSet存在的唯一原因是它可以维持元素的排序状态，所以只有当需要一个排好序的Set时，才应该使用TreeSet。因为其内部结构支持排序，
 	并且因为迭代是我们有可能要执行的操作，所以，用TreeSet迭代通常比用HashSet快
 	
 	迭代最快的是linkedHashSet因为有一个链表
 	
 	
 * */
public interface Set<E> extends Collection<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean retainAll(Collection<?> c);
    boolean removeAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT);
    }
}
